home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / sync / symm.md / Sync_GetLock.s < prev    next >
Text File  |  1990-10-31  |  3KB  |  98 lines

  1. /*
  2.  * syncAsm.s --
  3.  *
  4.  *    Source code for the Sync_GetLock library procedure.
  5.  *
  6.  * Copyright 1988 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16.     .data
  17.     .asciz "$Header: /sprite/src/lib/c/sync/symm.md/RCS/Sync_GetLock.s,v 1.2 90/10/31 17:44:23 kupfer Exp $ SPRITE (Berkeley)"
  18.     .align 2
  19.     .text
  20.  
  21. /* $Log:    Sync_GetLock.s,v $
  22.  * Revision 1.2  90/10/31  17:44:23  kupfer
  23.  * Can't have comments in comments.
  24.  * 
  25.  * Revision 1.1  90/10/31  17:41:10  kupfer
  26.  * Initial revision
  27.  * 
  28.  * Revision 1.2  90/03/05  14:41:32  rbk
  29.  * Add call to Sync_SlowLock() if can't get it right away.
  30.  * Cleaned up a bit (use # in line comments), and loose save/restore of
  31.  * scratch registers.
  32.  * 
  33.  * Revision 1.1  90/03/05  10:13:44  rbk
  34.  * Initial revision
  35.  * 
  36.  * Based on Sync_GetLock.s,v 1.1 88/06/19 14:34:17 ouster
  37.  */
  38.  
  39. #include "kernel/machAsmDefs.h"
  40.  
  41.  
  42. /*
  43.  * ----------------------------------------------------------------------------
  44.  *
  45.  * Sync_GetLock --
  46.  *
  47.  *    Acquire a lock.  Other processes trying to acquire the lock
  48.  *    will block until this lock is released.
  49.  *
  50.  *      A critical section of code is protected by a lock.  To safely
  51.  *      execute the code, the caller must first call Sync_GetLock to
  52.  *      acquire the lock on the critical section.  At the end of the
  53.  *      critical section the caller has to call Sync_Unlock to release
  54.  *      the lock and allow other processes to execute in the critical
  55.  *      section.
  56.  *
  57.  * Results:
  58.  *    None.
  59.  *
  60.  * Side effects:
  61.  *      The lock is set.  Other processes will be blocked if they try
  62.  *      to lock the same lock.  A blocked process will try to get the
  63.  *      lock after this process unlocks the lock with Sync_Unlock.
  64.  *
  65.  * C equivalent:
  66.  *
  67.  *    void
  68.  *    Sync_GetLock(lockPtr)
  69.  *       Sync_Lock *lockPtr;
  70.  *    {
  71.  *        if (Sun_TestAndSet(&(lockPtr->inUse)) != 0) {
  72.  *        Sync_SlowLock(lockPtr); 
  73.  *        }
  74.  *    }
  75.  *
  76.  *----------------------------------------------------------------------
  77.  * typedef struct Sync_UserLock {
  78.  *    Boolean inUse;              // 1 while the lock is busy 
  79.  *    Boolean waiting;            // 1 if someone wants the lock
  80.  * } Sync_UserLock;
  81.  *
  82.  */
  83.  
  84. ENTRY(Sync_GetLock)
  85.     movl    SPARG0, %eax        # address of lock
  86.     movl    $1, %edx        # 1 == locked
  87.     xchgl   %edx, (%eax)            # try for lock
  88.         cmpl    $0, %edx            # got it?
  89.         jne     1f                      # nope -- do it the hard way.
  90.     RETURN                # got it!
  91.     /*
  92.      * Didn't get the lock on first attempt.  Call kernel.
  93.      */
  94. 1:    pushl    %eax            # lockPtr
  95.     CALL    _Sync_SlowLock        # call kernel to get lock
  96.     addl    $4, %esp        # clear stack
  97.     RETURN                # done
  98.